/*
 * ArbolContextosPPMC.h
 *
 *  Created on: 29/04/2012
 *      Author: lucas
 */

#ifndef ARBOLCONTEXTOSPPMC_H_
#define ARBOLCONTEXTOSPPMC_H_

#include "../hdr/NodoContexto.h"
#include "../hdr/EmisorAritmetico.h"
#include "../hdr/LectorAritmetico.h"

class ArbolContextosPPMC {
	public:
		// Constructor del Arbol. archivo es de donde se van a 
		// emitir los caracteres comprimidos o se van a leer para descomprimir
		// comprime vale 1 si comprime, 0 si descomprime
		ArbolContextosPPMC(FILE *archivo, int comprime);
		int procesarCaracter(unsigned short caracter, unsigned char* contexto,
				size_t orden);
		/* 'contexto' es el contexto donde se está procesando. 'orden' indica el orden de la 
		 * compresion. 'caracter' es una direccion de memoria valida donde se devuelve
		 * el caracter procesado. 
		 * Devuelve 1 en caso de haber procesado el EOF, 0 en cualquier otro caso. */
		int procesarProbabilidad(unsigned char* caracter, unsigned char* contexto,
				size_t orden);
		virtual ~ArbolContextosPPMC();
		void terminarEmision();
	private:
		EmisorAritmetico *emisor;
		LectorAritmetico *lector;
		NodoContexto nodoOrden0;
		int _procesarCaracter(NodoContexto* nodo, unsigned short caracter,
				unsigned char* contexto, size_t orden, size_t profundidad,
				char* proxExclusion);
		int _procesarProbabilidad(NodoContexto* nodo, unsigned char* caracter,
				unsigned char* contexto, size_t orden, size_t profundidad, 
				Vector<short> **proxExclusion);
		// Durante la descompresion, Una vez que obtuve el caracter debo agregarlo
		// en los contextos superiores
		void actualizaCaracterLeido(NodoContexto* nodo, unsigned char* caracter, 
				unsigned char* contexto, size_t orden, size_t profundidad);
		int procesarProbabilidadMenosUno(unsigned char* caracter, Vector<short>* excluidos);
};

#endif /* ARBOLCONTEXTOSPPMC_H_ */
